package com.itheima.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.itheima.constant.MessageConstant;
import com.itheima.dao.MenuDao;
import com.itheima.entity.PageResult;
import com.itheima.dao.RoleDao;
import com.itheima.pojo.Menu;
import com.itheima.pojo.Role;
import com.itheima.service.MenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 菜单模块接口实现类
 */
@Service(interfaceClass = MenuService.class)
@Transactional
public class MenuServiceImpl implements MenuService {
    @Autowired
    private MenuDao menuDao;


    /**
     * 根据用户名查询菜单
     * @return
     */
    @Override
    public List<Menu> getMenu(String username) {

        return  menuDao.getMenu(username);
    }
	
	/**
     * 分页查询菜单列表
     * @param currentPage 当前页数
     * @param pageSize 每页条数
     * @param queryString 查询条件
     * @return 菜单列表
     */
    @Override
    public PageResult findPage(Integer currentPage, Integer pageSize, String queryString) {
//        注册分页信息
        PageHelper.startPage(currentPage,pageSize);
        //通过查询条件获得菜单列表
        List<Menu> rows = menuDao.findListByCondition(queryString);
        //创建pageInfo对象
        PageInfo<Menu> pageInfo = new PageInfo<>(rows);
        return new PageResult(pageInfo.getTotal(),pageInfo.getList());
    }

    /**
     * 根据id获得menu对象
     * @param id menu id
     * @return menu 对象
     */
    @Override
    public Menu findById(Integer id) {
        return menuDao.findById(id);
    }

    /**
     * 编辑菜单信息
     * @param menu 菜单信息
     */
    @Override
    public void edit(Menu menu) {
        //只修改name description icon linkUrl其余的都不修改
        menuDao.edit(menu);
    }

	/**
     * 修改菜单信息
     * @param id 菜单id
     */
    @Override
    public void delete(Integer id) {
        //通过id获得menu对象
        Menu menu = menuDao.findById(id);
        //如果该菜单parentMenuid == null, 就赋值为0
        if (menu.getParentMenuId() == null){
            menu.setParentMenuId(0);
        }
        //根据id获得子菜单的数量
        int count = menuDao.findChildrenCountByParentId(id);
        //如果数量大于0,则抛出异常
        if (count > 0){
            throw new RuntimeException(MessageConstant.DELETE_MENU__CONFLICT);
        }
        //否则就删除
        menuDao.delete(id);
    }

	/**
     * 增加菜单
     * @param menu 菜单信息
     */
    @Override
    public void add(Menu menu) {
        //判断是父是还子
        if (menu.getParentMenuId() == null){
            //父 获得父标签中最大的path和priority
            String maxPath = menuDao.findMaxPathOnParentMenu();
            //如果为null 则代表还没有父菜单
            if (maxPath == null){
                maxPath = "0";
            }
            //如果为null 则代表还没有父菜单
            Integer maxPriority= menuDao.findMaxPriorityOnParentMenu();
            if(maxPriority==null){
                maxPriority = 0;
            }
            String path = String.valueOf(Integer.parseInt(maxPath) + 1);
            Integer priority = maxPriority + 1;
            menu.setPath(path);
            menu.setPriority(priority);
        }else {
            //子 获得父对象
            Menu fatherMenu = menuDao.findById(menu.getParentMenuId());
            String fatherPath = fatherMenu.getPath();
            //获得该父标签中最大的priority
            Integer maxPriority= menuDao.findMaxPriorityByParentMenuId();
            if (maxPriority==null){
                //说明该父标签下还没有子标签
                maxPriority= 0;
            }
            String path = "/" + fatherPath + "-" + (maxPriority + 1);
            Integer priority = maxPriority + 1;
            menu.setPath(path);
            menu.setPriority(priority);
        }
        //添加菜单信息
        menuDao.add(menu);
    }
	
	
    /**
     * 获取全部菜单
     * @return
     */
    @Override
    public List<Menu> findAll() {
        return menuDao.findAll();
    }

    /**
     * 根据RoleId获得所有菜单权限Id列表
     */
    @Override
    public List<Integer> findMenuIdsByRoleId(Integer roleId) {
        return menuDao.findMenuIdsByRoleId(roleId);
    }

}
